#etiquetas L y C son para figuras, las demas son para puntos, los puntos base son O,X,Z,P,W,Q, los demas son de intersecciones
#Pendientes
#agregar codigo que verifique que no haya dos labels iguales
#se da por hecho que no las hay, pues meter hasta mil lables para circulos y lineas
#corregir intersecciones 	URGE
#corregir borrado               URGE

# -*- coding: utf-8 -*-
import turtle
import random
import lectura
import math
from sympy import *
from sympy.geometry import * 
position_puntos= []
labelsfiguras=[]
pet = turtle.getturtle()

def delete(p):
     print("borrandoo ------")
     if p.find('L')>=0:  #borrar label linea
          for i in range(len(labelsfiguras)):   
              if labelsfiguras[i] == p:
                   origen=labelsfiguras[i+1][0]
                   destino=labelsfiguras[i+1][1]
                   pop=i
              i+=1
          for j in range(len(position_puntos)):
                      if position_puntos[j] == origen:
                           a=int(position_puntos[j+1][0]) 
                           print(a)
                           b=int(position_puntos[j+1][1])
                           print (b)
                      elif position_puntos[j] == destino :
                           c=int (position_puntos[j+1][0]) 
                           print (c)
                           d=int (position_puntos[j+1][1])
                           print (d)
                      j+=1 
          midx=(c+a)/2
          midy=(d+b)/2
          #labelsfiguras.pop(pop)
          #labelsfiguras.pop(pop+1)
          pet.setpos(midx,midy)
          pet.pencolor('white')
          for k in range(0,100): 
                 pet.write("BAB")
                 pet.write("ABA")
                 k+=1
          pet.pencolor('black') 
          pet.penup()
          print (labelsfiguras)   
            
     elif  p.find('C')>=0:   #borrar label circulo
          for i in range(len(labelsfiguras)):   
              if labelsfiguras[i] == p:
                   origen=labelsfiguras[i+1][0]
                   destino=labelsfiguras[i+1][1]
                   pop=i
              i+=1
          for j in range(len(position_puntos)):
                      if position_puntos[j] == origen:
                           a=int(position_puntos[j+1][0]) 
                           print(a)
                           b=int(position_puntos[j+1][1])
                           print (b)
                      elif position_puntos[j] == destino :
                           c=int (position_puntos[j+1][0]) 
                           print (c)
                           d=int (position_puntos[j+1][1])
                           print (d)
                      j+=1
              ##codigo label circulo
          if a<c:
              pet.penup()
              pet.setpos(a,b)
               
              distancia=math.sqrt((a-c)**2+(b-d)**2)
              pet.bk(distancia+15)  
              pet.pencolor('white')
              for k in range(0,100): 
                 pet.write("BAB")
                 pet.write("ABA")
                 k+=1
              pet.pencolor('black') 
              pet.penup()
               
             
          else:    
              pet.penup()
              pet.setpos(a,b)
             
              distancia=math.sqrt((a-c)**2+(b-d)**2)
              pet.fd(distancia+15) 
              pet.pencolor('white')
              for k in range(0,100): 
                 pet.write("BA")
                 pet.write("AB")
                 k+=1
              pet.pencolor('black') 
              pet.penup()    
              
          #labelsfiguras.pop(pop)   sacando labels de la bitacora
          #labelsfiguras.pop(pop+1)    sacando labels de la bitacora
              
          



     else:
          for j in range(len(position_puntos)):
                      if position_puntos[j] == p:
                           a=int(position_puntos[j+1][0])
                           
                           print(a)
                           b=int(position_puntos[j+1][1])
                           print (b)
                           pop=j
                          
          pet.setpos(a,b)
          pet.pencolor('white')
          for k in range(0,100): 
                 pet.write("BA")
                 pet.write("AB")
                 k+=1
          pet.pencolor('black') 
          pet.penup() 
          #position_puntos.pop(pop)
          #position_puntos.pop(pop+1)
          print (position_puntos)   
          
           
          
          
def punto(point):
	num=len(point)
        print (num)
        
        print ("ekjfdeoidnpeicnoeicnoecn")
        a =random.randint(-300, 300)
        b =random.randint(-300, 300)
        pet.penup()
	pet.setpos(a,b)
	for k in range (0,num):
                pl=point[k]
                pet.forward(80)
		position_puntos.append(pl)
                position_puntos.append(pet.pos())
		pet.dot()
		pet.write(pl)
                pet.hideturtle()
        print (position_puntos)


def linea(origen,destino):
         for i in range(len(position_puntos)):
            if position_puntos[i] == origen:
                    a=int(position_puntos[i+1][0])
                    print(a)
                    b=int(position_puntos[i+1][1])
                    print (b)
            elif position_puntos[i] == destino :
                    c=int (position_puntos[i+1][0])
                    print (c)
                    d=int (position_puntos[i+1][1])
                    print (d)
                    
                    
                
            i+=1
         
         pet.setpos(a,b)
         pet.pendown()
         pet.setpos(c,d)
         pet.penup()
                 

def linealabel(label,origen,destino):
        midx=0
        midy=0
        for i in range(len(position_puntos)):
             if position_puntos[i] == origen:
                    a=int(position_puntos[i+1][0])
                    print ("valor de a")
                    print(a)
                    b=int(position_puntos[i+1][1])
                    print ("valorde b")
                    print (b)
             elif position_puntos[i] == destino :
                    c=int (position_puntos[i+1][0])
                    print ("valorde c")
                    print (c)
                    d=int (position_puntos[i+1][1])
                    print ("valorde d")
                    print (d)
             i+=1
         
        
     
        midx=(c+a)/2
        midy=(d+b)/2
        labelsfiguras.append(label)
        labelsfiguras.append([origen,destino])
        pet.setpos(midx,midy)
        pet.write(label) 
        pet.penup()


def circlelabel(label,origen,destino):           ##Problemas etiquetado de circulo checar borrado
        distancia=0
        for i in range(len(position_puntos)):
             if position_puntos[i] == origen:
                    a=int(position_puntos[i+1][0])
                    print ("valor de a")
                    print(a)
                    b=int(position_puntos[i+1][1])
                    print ("valorde b")
                    print (b)
             elif position_puntos[i] == destino :
                    c=int (position_puntos[i+1][0])
                    print ("valorde c")
                    print (c)
                    d=int (position_puntos[i+1][1])
                    print ("valorde d")
                    print (d)
             i+=1
        if a<c:
              pet.penup()
              pet.setpos(a,b) 
              distancia=math.sqrt((a-c)**2+(b-d)**2)
              pet.bk(distancia+15)  ###remeber de 5 idiot
              pet.write(label)     
              labelsfiguras.append(label)
              labelsfiguras.append([origen,destino])
        else:    
              pet.penup()
              pet.setpos(a,b)
              distancia=math.sqrt((a-c)**2+(b-d)**2)
              pet.fd(distancia+15)  ###remeber de 5 idiot
              pet.write(label)     
              labelsfiguras.append(label)
              labelsfiguras.append([origen,destino])
        print(label)
        print(labelsfiguras)
    


def circulo(centro,radio):
        
         for i in range(len(position_puntos)):
            if position_puntos[i] == centro:
                    a=int(position_puntos[i+1][0])
                    print(a)
                    b=int(position_puntos[i+1][1])
                    print (b)
            elif position_puntos[i] == radio :
                    c = int (position_puntos[i+1][0])
                    print (c)
                    d = int (position_puntos[i+1][1])
                    print (d)
                             
                
            i+=1
               
         pet.setpos(a,b) 
         distancia=math.sqrt((a-c)**2+(b-d)**2)
         
         
     
         if a<c:
                 pet.fd(distancia)
		 pet.rt(-90)
		 pet.pendown()
		 pet.circle(distancia)
		 pet.rt(90)
                 pet.penup()
                 pet.bk(distancia)
		    
         else:    
		 pet.bk(distancia)
		 pet.rt(90)
		 pet.pendown()
		 pet.circle(distancia)
		 pet.rt(-90)
		 pet.penup()
                 pet.fd(distancia)
       
def intersect(objeto1,objeto2,etiqueta1,etiqueta2):
             
             for i in range(len(labelsfiguras)):
                      if labelsfiguras[i] == objeto1:
                           obj1_1aux=labelsfiguras[i+1][0]
                           obj1_2aux=labelsfiguras[i+1][1]
                      if  labelsfiguras[i] == objeto2:
                           obj2_1aux=labelsfiguras[i+1][0]
                           obj2_2aux=labelsfiguras[i+1][1]
                      i+=1 
             for j in range(len(position_puntos)):
                      if position_puntos[j] == obj1_1aux:
                           x1_1=int(position_puntos[j+1][0]) #(x,y)1 de la primer linea
                           print(x1_1)
                           y1_1=int(position_puntos[j+1][1])
                           print (y1_1)
                      elif position_puntos[j] == obj1_2aux :
                           x1_2=int (position_puntos[j+1][0]) #(x,y)2 de la primer linea
                           print (x1_2)
                           y1_2=int (position_puntos[j+1][1])
                           print (y1_2)
                    
                      j+=1 
             for k in range(len(position_puntos)):
                      if position_puntos[k] ==obj2_1aux:
                           x2_1=int(position_puntos[k+1][0]) #(x,y)2 de la segunda linea
                           print(x1_1)
                           y2_1=int(position_puntos[k+1][1])
                           print (y1_1)
                      elif position_puntos[k] == obj2_2aux :
                           x2_2=int (position_puntos[k+1][0]) #(x,y)2 de la primer linea
                           print (x1_2)
                           y2_2=int (position_puntos[k+1][1])
                           print (y1_2)
                    
                      k+=1 
                   
             if  objeto1.find('L')>=0 and  objeto1.find('L')>=0 : #caso recta recta solo una interseccio
                   
                
             #P1=(x1_1,y1_1) ; P2=(x1_2,y1_2)   Q1=(x2_1,y2_1) ; Q2=(x2_2,y2_2) ##solo obtuvimos los puntos
             #buscamos interseccion    
                 l1 = Line(Point(x1_1,y1_1),Point(x1_2,y1_2) )
                 l2 = Line(Point(x2_1,y2_1),Point(x2_2,y2_2)) 
                 intersect=intersection(f1,f2)
                 print (intersect)
                 pet.setpos(float(intersect[0].x),float(intersect[0].y))
                 position_puntos.append(etiqueta1)
                 position_puntos.append(pet.pos())
                 pet.write(etiqueta1)   
                 pet.dot()
                   
                   

              
             
             elif  objeto1.find('C')>=0 and  objeto1.find('C')>=0 : 
             
                 #P1=(x1_1,y1_1) ; P2=(x1_2,y1_2)   Q1=(x2_1,y2_1) ; Q2=(x2_2,y2_2) ##solo obtuvimos los puntos
                 #buscamos interseccion
                 #caso dos circulos ##verificar labels
                 if etiqueta2==0:
                      print("Interseccion tangente de dos circunferencias")
                      r1=math.sqrt((x1_1-x1_2)**2+(y1_1-y1_2)**2)
                      r2=math.sqrt((x2_1-x2_2)**2+(y2_1-y2_2)**2)
                      c1=Point(x1_1,y1_1)
                      c2=Point(x2_1,y2_1)
                      f1=Circle(c1,r1)
                      f2=Circle(c2,r2) 
                      if f1.is_tangent(f2):
	                      intersect=intersection(f1,f2)
		              print (c1)
		              print (c2) 
		              print (r1)
		              print (r2)
		              print (f1)
		              print (f2)
		              print (intersect) 
		              pet.setpos(float(intersect[0].x),float(intersect[0].y))
		              position_puntos.append(etiqueta1)
		              position_puntos.append(pet.pos())
                              pet.write()   
		              pet.dot()                
                      else:
                              print ("********Error cicunferencias no tangentes***********")
                          


                          
                     
                 else:
                 
                 #dos intersecciones  
                     print("Interseccion de dos circunferencias")
                     r1=math.sqrt((x1_1-x1_2)**2+(y1_1-y1_2)**2)
                     r2=math.sqrt((x2_1-x2_2)**2+(y2_1-y2_2)**2)
                     c1=Point(x1_1,y1_1)
                     c2=Point(x2_1,y2_1)
                     f1=Circle(c1,r1)
                     f2=Circle(c2,r2)                  
                     intersect=intersection(f1,f2)
                     
                     print (c1)
                     print (c2) 
                     print (r1)
                     print (r2)
                     print (f1)
                     print (f2)
                     print (intersect)
                     
                     #Hacer etiquetas para position points 
                     op1=  float (intersect[0].x)
                     op2 = float(intersect[0].y)
                 
                     pet.setpos(op1,op2)
                     position_puntos.append(etiqueta1)
                     position_puntos.append(pet.pos())
                     
                     
                     print (etiqueta1)
                     pet.write(etiqueta1)  
                     
                     print (position_puntos) 
                     pet.dot()
                     pet.setpos(float(intersect[1].x),float(intersect[1].y))
                     
                     position_puntos.append(etiqueta2)
                     position_puntos.append(pet.pos())
                     print (etiqueta2)
                     print (pet.pos())
                     pet.write(etiqueta2) 
                     pet.dot()
                     
             else:  #caso recta circulo
                    if etiqueta2==0:
                           if  objeto1.find('C')>=0 and  objeto1.find('L')>=0:
		             r1=math.sqrt((x1_1-x1_2)**2+(y1_1-y1_2)**2)
		             c1=Point(x1_1,y1_1)
		             l1 = Line(Point(x2_1,y2_1),Point(x2_2,y2_2))
		             f1= Circle(c1,r1)
			     if  f1.is_tangent(l1):    
				     intersect=intersection(f1,l1)
				     pet.setpos(float(intersect[0].x),float(intersect[0].y))
				     position_puntos.append(etiqueta1)
				     position_puntos.append(pet.pos())
				     pet.write(etiqueta1)   
				     pet.dot()
                             else:
                                  print("******Error no hay tangencia********")
                           else: 
                             r1 = math.sqrt((x2_1-x2_2)**2+(y2_1-y2_2)**2)
		             c1 = Point(x2_1,y2_1)
		             l1 = Line(Point(x1_1,y1_1),Point(x1_2,y1_2))
		             f1 = Circle(c1,r1)
		             if  f1.is_tangent(l1):    
				     intersect=intersection(f1,l1)
				     pet.setpos(float(intersect[0].x),float(intersect[0].y))
				     position_puntos.append(etiqueta1)
				     position_puntos.append(pet.pos())
				     pet.write(etiqueta1)   
				     pet.dot()
                             else:
                                  print("******Error no hay tangencia********")

                    
                    else: 
		         if  objeto1.find('C')>=0 and  objeto1.find('L')>=0:
		             r1=math.sqrt((x1_1-x1_2)**2+(y1_1-y1_2)**2)
		             c1=Point(x1_1,y1_1)
		             l1 = Line(Point(x2_1,y2_1),Point(x2_2,y2_2))
		             f1= Circle(c1,r1)
		             intersect=intersection(f1,l1)
		             pet.setpos(float(intersect[0].x),float(intersect[0].y))
		             position_puntos.append(etiqueta1)
		             position_puntos.append(pet.pos())
		             pet.write(etiqueta1)   
		             pet.dot()
		             pet.setpos(float(intersect[1].x),float(intersect[1].y))
		             position_puntos.append(etiqueta2)
		             position_puntos.append(pet.pos())
		             pet.write(etiqueta2) 
		             pet.dot()
		             
		             
			 else:
		             r1 = math.sqrt((x2_1-x2_2)**2+(y2_1-y2_2)**2)
		             c1 = Point(x2_1,y2_1)
		             l1 = Line(Point(x1_1,y1_1),Point(x1_2,y1_2))
		             f1 = Circle(c1,r1)
		             intersect=intersection(f1,l1)
		             pet.setpos(float(intersect[0].x),float(intersect[0].y))
		             position_puntos.append(etiqueta1)
		             position_puntos.append(pet.pos())
		             pet.write(etiqueta1)   
		             pet.dot()
		             pet.setpos(float(intersect[1].x),float(intersect[1].y))
		             position_puntos.append(etiqueta2)
		             position_puntos.append(pet.pos())
		             pet.write(etiqueta2) 
		             pet.dot()		




def conc(labels):
        k=len(labels)
         
        g=0
        while g<k:
            
            ax=labels[g]   
            if ax.isdigit():
                 labels[g-1]=str(labels[g-1])+str(labels[g])
                 labels.pop(g)
                 k=len(labels)
                 
            g+=1 
        return labels

def genlinelabel(labels):
       labels=conc(labels)
       labels=conc(labels)
       labels=conc(labels)
       labels=conc(labels)
       origen=labels[0] 
       destino=labels[1]
       etiqueta=labels[2]
       linealabel(etiqueta,origen,destino)
        
def gencirclelabel(labels):
       labels=conc(labels)
       labels=conc(labels)
       labels=conc(labels)
       labels=conc(labels)
       centro=labels[0] 
       radio=labels[1]
       etiqueta=labels[2]
       circlelabel(etiqueta,centro,radio)
    


def genlintersect(labels):
       labels=conc(labels)
       labels=conc(labels)
       labels=conc(labels)
       labels=conc(labels)
       q=len(labels)
      
       print (q)
       if q==4:
           intersect(labels[0],labels[1],labels[2],labels[3])
       else:
           intersect(labels[0],labels[1],labels[2],0)
       
       





def genlines(labels):
       labels=conc(labels)
       labels=conc(labels)
       labels=conc(labels)
       labels=conc(labels) 
       origen=labels[0]
       destino=labels[1]
       linea(origen,destino)

def gencircle(labels):
       labels=conc(labels)
       labels=conc(labels)
       labels=conc(labels)
       labels=conc(labels) 
       centro=labels[0]
       radio=labels[1]
      
       print (centro)
       print (radio)
       circulo(centro,radio)

def gendeletelabel(labels):
       labels=conc(labels)
       labels=conc(labels)
       labels=conc(labels)
       labels=conc(labels) 
       delete(labels[0])
def saltonum(labels):
       labels=conc(labels)
       labels=conc(labels)
       labels=conc(labels)
       labels=conc(labels)
       numero=labels[3].replace(";","")
       numero=int(numero)
       return numero

def gencheck(labels):
       labels=conc(labels)
       labels=conc(labels)
       labels=conc(labels)
       labels=conc(labels)
       booleano=False
       circulo=labels[0]
       punto=labels[1]
       for i in range(len(labelsfiguras)):   
              if labelsfiguras[i] == circulo:
                   origen=labelsfiguras[i+1][0]
                   destino=labelsfiguras[i+1][1]
                   
              i+=1
       for j in range(len(position_puntos)):
             if position_puntos[j] == origen:
                    a=int(position_puntos[j+1][0])
                    b=int(position_puntos[j+1][1])
                    print ("valorde b")
                    print (b)
             elif position_puntos[j] == destino :
                    c=int (position_puntos[j+1][0])
                    d=int (position_puntos[j+1][1])
             elif position_puntos[j] == punto :
                    e=int (position_puntos[j+1][0])
                    f=int (position_puntos[j+1][1])     
             j+=1
       distancia=math.sqrt((a-c)**2+(b-d)**2)
       #verificamos si cumple la ecuacion de la recta
       
       if (e-a)**2+(f-b)**2-distancia**2==0:
           booleano=True
       return booleano 
       
def genpoints(labels):
        

       
       labels=conc(labels)
       labels=conc(labels)
       labels=conc(labels)
       labels=conc(labels)  #puede recibir puntos hasta de cifras de cuatro ceros  
        
              
 
       
       cus=[]
       pes=[]
       os=[]
       equis=[]
       zetas=[]
       doblev=[]

       for i in range(len(labels)):
           if labels[i].find('Q') >= 0:
                 cus.append(labels[i])
           elif labels[i].find('P') >= 0:
                 pes.append(labels[i])
           elif labels[i].find('O') >= 0:
                 os.append(labels[i])         
           elif labels[i].find('X')>= 0:
                 equis.append(labels[i])
           elif labels[i].find('Z') >= 0:
                 zetas.append(labels[i])  
           elif labels[i].find('W') >= 0:
                 doblev.append(labels[i])
      
       punto(cus)
       punto(pes)
       punto(os)
       punto(equis)
       punto(zetas)
       punto(doblev)
     
     
       return labels
      





